package org.quincy.netty.test.processor;

import org.quincy.netty.test.comm.Terminal;
import org.quincy.rock.comm.MessageSender;
import org.quincy.rock.comm.process.MessageProcessor4Integer;
import org.quincy.rock.core.exception.UnsupportException;
import org.quincy.rock.core.util.RockUtil;
import org.slf4j.Logger;

/**
 * <b>报文处理器抽象基类。</b>
 * <p><b>详细说明：</b></p>
 * <!-- 在此添加详细说明 -->
 * 无。
 * <p><b>修改列表：</b></p>
 * <table width="100%" cellSpacing=1 cellPadding=3 border=1>
 * <tr bgcolor="#CCCCFF"><td>序号</td><td>作者</td><td>修改日期</td><td>修改内容</td></tr>
 * <!-- 在此添加修改列表，参考第一行内容 -->
 * <tr><td>1</td><td>wks</td><td>2018年5月14日 下午9:32:54</td><td>建立类型</td></tr>
 * 
 * </table>
 * @version 1.0
 * @author wks
 * @since 1.0
 */
public abstract class MessageProcessor<M> extends MessageProcessor4Integer<M> {
	/**
	 * logger。
	 */
	protected static final Logger logger = RockUtil.getLogger(MessageProcessor.class);

	/** 
	 * process。
	 * @see org.quincy.rock.comm.process.MessageProcessor#process(org.quincy.rock.comm.MessageSender, java.lang.Object, java.lang.Object, java.lang.Object)
	 */
	@Override
	public final void process(MessageSender<Integer> sender, Object terminalId, Object msgId, M content) {
		if (logger.isDebugEnabled()) {
			StringBuilder sb = new StringBuilder();
			sb.append("处理[");
			sb.append(terminalId);
			sb.append("]号终端的[");
			sb.append(getFunctionCode());
			sb.append("]号报文，内容：");
			sb.append(content);
			logger.debug(sb.toString());
		}
		this.process(sender, (Terminal) terminalId, msgId, content);
	}

	/**
	 * <b>处理报文。</b>
	 * <p><b>详细说明：</b></p>
	 * 无。
	 * @param sender 消息发送者
	 * @param terminal 终端标识
	 * @param msgId 消息id
	 * @param content 消息正文数据
	 */
	protected abstract void process(MessageSender<Integer> sender, Terminal terminal, Object msgId, M content);

	/**
	 * <b>获得响应功能码。</b>
	 * <p><b>详细说明：</b></p>
	 * <!-- 在此添加详细说明 -->
	 * 无。 
	 * @return 响应功能码
	 */
	protected final Integer getResponeCode() {
		Integer code = this.getFunctionCode() + 10000;
		if (code > 29999)
			throw new UnsupportException(code.toString());
		return code;
	}

	/**
	 * <b>getAddToList。</b>
	 * <p><b>详细说明：</b></p>
	 * <!-- 在此添加详细说明 -->
	 * 无。
	 * @return
	 */
	protected final AddToList getAddToList() {
		return (AddToList) getOwner();
	}
}
